﻿using System;
using System.Data.Common;
using System.Data.SQLite;
using System.IO;
using BLToolkit.Data.DataProvider;
using BLToolkit.DataAccess;

namespace Rsdn.Janus.Sqlite
{
	[JanusDBDriver(
		DriverName,
		"Rsdn.Janus.Sqlite.Resources",
		"DriverDisplayName",
		"DriverDescription",
		LockRequired = true)]
	internal class SqliteDriver : IDBDriver
	{
		public const string DriverName = "SQLite";
		private readonly IServiceProvider _provider;
		private readonly SqliteSqlFormatter _sqlFormatter = new SqliteSqlFormatter();

		public SqliteDriver(IServiceProvider provider)
		{
			_provider = provider;
		}

		#region IDBDriver Members

		public bool CheckConnectionString(string constr)
		{
		    bool ret = false;
            //CheckDbPresence(constr);
			try
			{
				SQLiteConnectionStringBuilder csbCheck = new SQLiteConnectionStringBuilder(constr);
                if (File.Exists(csbCheck.DataSource))
                {
                    using (SQLiteConnection con = new SQLiteConnection(csbCheck.ConnectionString))
                    {
                        con.Open();
                    }
                    ret = true;
                }
			}
			catch
			{
			    ret = false;
			}
		    return ret;
		}

	    /// <summary>
	    /// Проверить если файл базы данных существует.
	    /// Ошибки, посредством исключений
	    /// </summary>
	    /// <param name="constr">Строка подключения</param>
        /// <exception cref="DataAccessException">Файл базы данных {0} не найден</exception>
	    public void CheckDbPresence(string constr)
	    {
            SQLiteConnectionStringBuilder csbCheck = new SQLiteConnectionStringBuilder(constr);
            if (!File.Exists(csbCheck.DataSource))
            {
                throw new DataAccessException(string.Format("Файл базы данных {0} не найден", csbCheck.DataSource));
            }
        }

	    /// <summary>
		/// Получить драйвер схемы.
		/// </summary>
		/// <returns></returns>
		public IDBSchemaDriver CreateSchemaDriver()
		{
			return new SqliteSchemaDriver(_provider);
		}

		public DbConnectionStringBuilder CreateConnectionString()
		{
			return CreateConnectionString(null);
		}

		public DbConnectionStringBuilder CreateConnectionString(string constr)
		{
			var csb = new SQLiteConnectionStringBuilder(constr) {LegacyFormat = false};
			return csb;
		}

		public IDBConfigControl CreateConfigControl()
		{
			return new SqliteConfigControl();
		}

		/// <summary>
		/// Создать провайдер для BLToolkit.
		/// </summary>
		public DataProviderBase CreateDataProvider()
		{
			return new SQLiteDataProvider();
		}

		/// <summary>
		/// Обработать запрос перед выполнением.
		/// </summary>
		public string PreprocessQueryText(string text)
		{
			return text;
		}

		/// <summary>
		/// Ссылка на форматтер SQL.
		/// </summary>
		public ISqlFormatter Formatter
		{
			get { return _sqlFormatter; }
		}
		#endregion
	}
}